package com.cheejee.goodscenter.service;

import java.util.Date;

import javax.validation.constraints.NotNull;

import org.springframework.validation.annotation.Validated;

import com.cheejee.goodscenter.module.dto.GoodsDto;
import com.cheejee.goodscenter.module.entity.Goods;
import com.github.pagehelper.Page;

/**
 * 
 * @author CARRY
 * @Date 2020年10月26日下午9:42:52
 */
@Validated
public interface GoodsService {

	Goods queryGoodsById(@NotNull(message = "商品ID不能为空") Long id);
	
	GoodsDto queryGoodsInfo(@NotNull(message = "商品ID不能为空") Long id);

	/**
	 * 查询出指定条件的商品，多个条件and连接
	 *
	 * @param brandId    品牌id
	 * @param categoryId 分类id
	 * @param goodsName  商品名称
	 * @param isOn       是否上架
	 * @param isDetelete 是否删除
	 * @return
	 */
	Page<Goods> queryGoods(Integer brandId, Integer categoryId, String goodsName, Boolean isOn, Boolean isDetelete, int pageNum, int pageSize);
	
	
	/**
	 * 使用商品销量进行排序
	 *
	 * @param collation 排序规则， true=asc， fals=desc
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	Page<Goods> queryGoodsOrderBySale(boolean collation, int pageNum, int pageSize);

	/**
	 * 使用商品创建时间排序
	 *
	 * @param collation 排序规则， true=asc， fals=desc
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	Page<Goods> queryGoodsOrderByTime(boolean collation, int pageNum, int pageSize);

	/**
	 * 新增商品，取第一张图片为宣传图
	 *
	 * @param goods 商品基本信息
	 * @return
	 */
	int addGoods(Goods goods);
	
	/**
	 * 新增商品信息，包含商品属性，SKU，规格信息
	 *
	 * @param goods
	 * @return
	 */
	int addGoodsInfo(GoodsDto goods);

	/**
	 * 修改商品基本信息(商品表），取第一张图片为宣传图
	 *
	 * @param goods 商品基本信息
	 * @return
	 */
	int changeGoods(Goods goods);
	
	/**
	 * 修改商品信息，包含sku，规格，属性，传入的关联信息为空则不更新对应的关联。
	 * <p>
	 * 注意：只会对商品的关联项进行更新操作，如果需要删除请调用对应的删除方法。
	 * </p>
	 *
	 * @param goods
	 * @return
	 */
	int changeGoodsInfo(GoodsDto goods);

	/**
	 * 删除商品，设置商品的删除状态
	 *
	 * @param id
	 * @return
	 */
	int deleteGoods(@NotNull(message = "要删除的商品不能为空") Long... id);

	/**
	 * 商品定时上下架
	 *
	 * @param timestamp 指定的时间，时间戳
	 * @param id
	 * @param type      true=上架，false=下架
	 */
	void taskUpAndDown(@NotNull(message = "定时上下架的时间不能为空") Date date, @NotNull(message = "定时上下架的类型不能为空") Boolean type, @NotNull(message = "定时上下架商品不能为空") Integer... id);
}
